﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Linq.Expressions;
using System.Data.Entity.Validation;

namespace Biblioteca.Acceso_a_Datos.Data_Mappers
{
    public class RepoGenerico<T>
        where T : class
    {

        private BibliotecaContext ctx;

        public RepoGenerico(BibliotecaContext ctx)
        {
            this.ctx = ctx;
            this.ctx.Database.Initialize(true);
        }

        
        // Se va a usar?
        public virtual IQueryable<T> EncontrarTodosSegun(Expression<Func<T, bool>> predicate)
        {
            IQueryable<T> resultado = this.ctx.Set<T>().Where(predicate);
            return resultado;
        }

        public virtual T EncontrarPrimeroSegun(Expression<Func<T, bool>> predicate)
        {
            return this.ctx.Set<T>().FirstOrDefault(predicate); 
        }

        public void Actualizar(T entity)
        {
            this.ctx.Entry(entity).Reload();
        }

        public virtual int Cantidad()
        {
            return this.ctx.Set<T>().Count();
        }

        // -------------------------------------SE USAN ----------------------------

        public virtual IList<T> Todos()
        {
            return this.ctx.Set<T>().ToList();
        }

        public virtual T Buscar(int id)
        {
            return this.ctx.Set<T>().Find(id);
        }

        public void Modificar(T entidad)
        {
            this.ctx.Entry(entidad).State = System.Data.EntityState.Modified;
            this.ctx.SaveChanges();
        }

        public void Agregar(T entidad)
        {

            this.ctx.Set<T>().Add(entidad);
            this.ctx.SaveChanges();
        }


        public void Eliminar(T entidad)
        {
            this.ctx.Set<T>().Remove(entidad);
            this.ctx.SaveChanges();
        }

        public void Dispose()
        {
            if (this.ctx != null)
                this.ctx.Dispose();
        }

        public void Guardar() { 
            this.ctx.SaveChanges();
        }
    }
}
